Title: Fix incorrect pinned maps handling and missing userspace setup code · Issue #12 · multikernel/kernelscript · GitHub
Open Graph Title: Fix incorrect pinned maps handling and missing userspace setup code · Issue #12 · multikernel/kernelscript
X Title: Fix incorrect pinned maps handling and missing userspace setup code · Issue #12 · multikernel/kernelscript
Description: When using the pin keyword with map declarations (e.g., pin var cpu_counters : array<...>), the current implementation faces two primary issues that prevent the maps from being correctly pinned to the BPF filesystem. The Problems Incorre...
Open Graph Description: When using the pin keyword with map declarations (e.g., pin var cpu_counters : array<...>), the current implementation faces two primary issues that prevent the maps from being correctly pinned to ...
X Description: When using the pin keyword with map declarations (e.g., pin var cpu_counters : array<...>), the current implementation faces two primary issues that prevent the maps from being correctly pinn...
Opengraph URL: https://github.com/multikernel/kernelscript/issues/12
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Fix incorrect pinned maps handling and missing userspace setup code","articleBody":"When using the `pin` keyword with map declarations (e.g., `pin var cpu_counters : array\u003c...\u003e`), the current implementation faces two primary issues that prevent the maps from being correctly pinned to the BPF filesystem.\n\n### The Problems\n\n1. **Incorrect Treatment as Global Variables**: The IR generator incorrectly creates both an IR map definition and an IR global variable for pinned maps. This causes the userspace codegen to treat the map as a \"pinned global variable,\" looking for a non-existent `__pinned_globals` map and resulting in the error: `Failed to find pinned globals map in eBPF object`.\n2. **Missing Setup Code**: Setup and pinning logic for maps is only generated if the userspace code explicitly performs map operations. However, pinned maps require setup (pinning to `/sys/fs/bpf/...`) even if they are only accessed within the eBPF program itself.\n3. **Variable Redefinition**: If multiple pinned maps exist, the generated C code uses the same variable name (`existing_fd`) for all of them, leading to compilation errors.\n4. **Missing Directory Creation**: The generated code fails to pin maps if the parent directory (e.g., `/sys/fs/bpf/\u003cproject\u003e/maps/`) does not already exist.\n\n### Proposed Changes\n\nThe provided patch addresses these issues with the following logic:\n\n* **IR Generator**: Modified `ir_generator.ml` to ensure that map-type global declarations only produce map definitions, not global variable entries.\n* **Userspace Codegen**:\n* Updated `userspace_codegen.ml` to trigger map setup and FD declarations if any pinned maps are detected (`has_pinned_maps`), regardless of whether they are used in userspace C code.\n* Implemented unique variable naming (e.g., `%s_existing_fd`) to prevent C redefinition errors.\n* Added a C helper function `ensure_bpf_dir` to recursively create the necessary BPF filesystem directories before pinning.\n* Included necessary headers (`\u003csys/stat.h\u003e`, `\u003csys/types.h\u003e`) when pinning is required.\n\n[fix_pin_var_map.patch](https://github.com/user-attachments/files/25742537/fix_pin_var_map.patch)\n\n### Verification\n\nTesting with `examples/maps_demo.ks` confirms:\n\n* The \"Failed to find pinned globals map\" error is resolved.\n* Maps are correctly pinned to `/sys/fs/bpf/maps_demo/maps/`.\n* Userspace programs compile and run correctly with multiple pinned maps.\n","author":{"url":"https://github.com/SiyuanSun0736","@type":"Person","name":"SiyuanSun0736"},"datePublished":"2026-03-04T14:01:23.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/12/kernelscript/issues/12"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:3d5ad8ca-a042-375d-2e84-da355d5b7a2b |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 8F98:17881E:1A56D40:253C793:6A61D861 |
| html-safe-nonce | 574ab307e142e1a6ec6b8be0a52599c2eb1cfc738075bed3c8b259e7244e9047 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4Rjk4OjE3ODgxRToxQTU2RDQwOjI1M0M3OTM6NkE2MUQ4NjEiLCJ2aXNpdG9yX2lkIjoiOTQ1NjA1MjUxNzg0ODkwNDY1IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | ec2955a28817bb195f099cddc9909099e7c88246553d8bf6183c8d3a2ae4939c |
| hovercard-subject-tag | issue:4022169574 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/multikernel/kernelscript/12/issue_layout |
| twitter:image | https://opengraph.githubassets.com/981a14f188594dc5f602a305a2c20d7749216eed6d7d9fd8b601b1856f9897ef/multikernel/kernelscript/issues/12 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/981a14f188594dc5f602a305a2c20d7749216eed6d7d9fd8b601b1856f9897ef/multikernel/kernelscript/issues/12 |
| og:image:alt | When using the pin keyword with map declarations (e.g., pin var cpu_counters : array<...>), the current implementation faces two primary issues that prevent the maps from being correctly pinned to ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | SiyuanSun0736 |
| hostname | github.com |
| expected-hostname | github.com |
| None | b2de8c74e5e61e893155ba46ee41bc66170c1644cb795adefa8386d490f7781c |
| turbo-cache-control | no-preview |
| go-import | github.com/multikernel/kernelscript git https://github.com/multikernel/kernelscript.git |
| octolytics-dimension-user_id | 202362072 |
| octolytics-dimension-user_login | multikernel |
| octolytics-dimension-repository_id | 1019261571 |
| octolytics-dimension-repository_nwo | multikernel/kernelscript |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1019261571 |
| octolytics-dimension-repository_network_root_nwo | multikernel/kernelscript |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | d1866027ded575df8a15c731dd8b9986c9483ceb |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width