Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simple Rust driver that touches real hardware: PR 4/6 #305

Merged
merged 2 commits into from
Jun 13, 2021

Conversation

TheSven73
Copy link
Collaborator

Simple Rust driver that touches real h/w: step 4 of 6

@alex and @ojeda suggested that #254 should be split into smaller PRs, so they can be reviewed and merged individually.

Roadmap:

  • platform_device
  • devicetree (of) matching
  • probe
  • DrvData (you are here)
  • regmap/iomem
  • finally the actual hwrng driver

@ksquirrel

This comment has been minimized.

@TheSven73 TheSven73 changed the title Simple Rust driver that touches real hardware: PR 3/6 Simple Rust driver that touches real hardware: PR 4/6 May 27, 2021
return Ok(0);
}

data.write(&0_u32)?;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a FIXME just in case?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review! While the PR x/6 effort is ongoing, the driver is a continual WIP. I'm just adding functionality, as it becomes available in the Rust kernel core.

Do you think there is merit in placing a "warning this is a work in progress, not fully functional" comment on top of the driver?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds reasonable to me. I'll add it.

@TheSven73 TheSven73 force-pushed the rust-for-linux-pdev-pr4 branch from fa1e44a to d047266 Compare June 4, 2021 19:40
@ksquirrel
Copy link
Member

Review of d0472669f89e:

  • ✔️ Commit 669248b: Looks fine!
  • ✔️ Commit d047266: Looks fine!

@TheSven73
Copy link
Collaborator Author

v1 -> v2:

  • rebased against latest rust branch

Sven Van Asbroeck added 2 commits June 12, 2021 19:33
Device driver data corresponds to per-device context data or state.
It is allocated on `probe()` and de-allocated in `remove()`.

Signed-off-by: Sven Van Asbroeck <thesven73@gmail.com>
To demonstrate device driver data in a non-trivial way, create
a `miscdev` for each discovered device. This `miscdev` can only be
opened and read. When read from userspace, it returns four zero bytes
at a time.

Note that `DrvData` consists of a `Pin<Box<miscdev::Registration>>`,
which is a pinned structure. This demonstrates that pinned or self-
referential structures may be used in `DrvData`.

Signed-off-by: Sven Van Asbroeck <thesven73@gmail.com>
@TheSven73 TheSven73 force-pushed the rust-for-linux-pdev-pr4 branch from d047266 to 615cc58 Compare June 12, 2021 23:42
@TheSven73
Copy link
Collaborator Author

v2 -> v3:

  • rebased against latest rust branch

@TheSven73 TheSven73 requested review from alex and wedsonaf June 12, 2021 23:43
@TheSven73
Copy link
Collaborator Author

I don't think this PR is particularly controversial or complex? It'd be great if more people could review, so the whole PR series could progress.

Copy link
Member

@alex alex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One small question, otherwise LGTM.

@@ -30,13 +30,31 @@ pub struct Registration {
// (it is fine for multiple threads to have a shared reference to it).
unsafe impl Sync for Registration {}

extern "C" {
#[allow(improper_ctypes)]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the improper ctype here?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without it, I get the following warning:

  RUSTC L rust/kernel.o
warning: `extern` block uses type `arch_spinlock_t`, which is not FFI-safe
    --> rust/kernel/platdev.rs:36:15
     |
36   |         pdev: *const bindings::platform_device,
     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe
     |
     = note: `#[warn(improper_ctypes)]` on by default
     = help: consider adding a member to this struct
     = note: this struct has no fields
note: the type is defined here
    --> /home/sva/repos/kernel-arcx/rust/bindings_generated.rs:7331:1
     |
7331 | pub struct arch_spinlock_t {}
     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

warning: 1 warning emitted

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What type is using arch_spinlock_t? Is it raw_spinlock? You can add the type to the opaque list:

--opaque-type spinlock
.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Gary, thanks for the help! I suspect that on arm 32-bit, arch_spinlock_t is just its own type, and not a typedef. So should I add it to --opaque-type?

typedef struct {
union {
u32 slock;
struct __raw_tickets {
#ifdef __ARMEB__
u16 next;
u16 owner;
#else
u16 owner;
u16 next;
#endif
} tickets;
};
} arch_spinlock_t;

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, when I add arch_spinlock_t to --opaque-type, I seem to enter some kind of rabbit-hole where different structures trigger the warning, and when you add those to --opaque-type, there are more structures that trigger it. So far I have:

--opaque-type arch_spinlock_t
--opaque-type lock_class_key
--opaque-type arch_rwlock_t
--opaque-type vm_userfaultfd_ctx

and still the warnings keep coming.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting arch_spinlock_t itself to opaque type just propagate the issue one struct up :)

Do you need to peek into fields of platform_device? If not, just setting that to opaque type will be sufficient.

Copy link
Collaborator Author

@TheSven73 TheSven73 Jun 13, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Edited wait a minute... yes, we do need to peek into platform_device. So that won't solve the issue...

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But the peeking is just a hack, and will disappear once we proceed. I'll make a mental note to add platform_device to --opaque-type later, and remove the #[allow(improper_ctypes)].

@alex alex merged commit 523b4dd into Rust-for-Linux:rust Jun 13, 2021
@TheSven73 TheSven73 deleted the rust-for-linux-pdev-pr4 branch June 13, 2021 01:05
@TheSven73
Copy link
Collaborator Author

Thank you @alex, appreciate your kind assistance :)

JoseTeuttli pushed a commit to JoseTeuttli/linux that referenced this pull request Jun 14, 2021
While doing error injection testing I got the following panic

  kernel BUG at fs/btrfs/tree-log.c:1862!
  invalid opcode: 0000 [#1] SMP NOPTI
  CPU: 1 PID: 7836 Comm: mount Not tainted 5.13.0-rc1+ Rust-for-Linux#305
  Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
  RIP: 0010:link_to_fixup_dir+0xd5/0xe0
  RSP: 0018:ffffb5800180fa30 EFLAGS: 00010216
  RAX: fffffffffffffffb RBX: 00000000fffffffb RCX: ffff8f595287faf0
  RDX: ffffb5800180fa37 RSI: ffff8f5954978800 RDI: 0000000000000000
  RBP: ffff8f5953af9450 R08: 0000000000000019 R09: 0000000000000001
  R10: 000151f408682970 R11: 0000000120021001 R12: ffff8f5954978800
  R13: ffff8f595287faf0 R14: ffff8f5953c77dd0 R15: 0000000000000065
  FS:  00007fc5284c8c40(0000) GS:ffff8f59bbd00000(0000) knlGS:0000000000000000
  CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
  CR2: 00007fc5287f47c0 CR3: 000000011275e002 CR4: 0000000000370ee0
  Call Trace:
   replay_one_buffer+0x409/0x470
   ? btree_read_extent_buffer_pages+0xd0/0x110
   walk_up_log_tree+0x157/0x1e0
   walk_log_tree+0xa6/0x1d0
   btrfs_recover_log_trees+0x1da/0x360
   ? replay_one_extent+0x7b0/0x7b0
   open_ctree+0x1486/0x1720
   btrfs_mount_root.cold+0x12/0xea
   ? __kmalloc_track_caller+0x12f/0x240
   legacy_get_tree+0x24/0x40
   vfs_get_tree+0x22/0xb0
   vfs_kern_mount.part.0+0x71/0xb0
   btrfs_mount+0x10d/0x380
   ? vfs_parse_fs_string+0x4d/0x90
   legacy_get_tree+0x24/0x40
   vfs_get_tree+0x22/0xb0
   path_mount+0x433/0xa10
   __x64_sys_mount+0xe3/0x120
   do_syscall_64+0x3d/0x80
   entry_SYSCALL_64_after_hwframe+0x44/0xae

We can get -EIO or any number of legitimate errors from
btrfs_search_slot(), panicing here is not the appropriate response.  The
error path for this code handles errors properly, simply return the
error.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

5 participants