kaist-cp / rv6

Other
125 stars 13 forks source link

Using `Branded` in `Disk` #617

Open travis1829 opened 2 years ago

travis1829 commented 2 years ago

현재 Braneded는 여러 개의 Kernel/Procs/WaitGuard 객체를 구분하기 위해 사용중인데, 사실 더 일반적으로 유용할만한 use case로는 이미 하나의 Kernel에 여러 개 존재하는 객체 (ex: Disk)를 구분하기 위해 사용할 때가 아닐까 싶습니다.


예로, Bcache의 invariant는, Buf는 항상 disk block의 latest 데이터를 가지고 있다는 것인데, rv6내에 여러 개의 Disk가 존재할 수 있는 경우 다음 method이 위 invariant를 깨트릴 수 있습니다.

impl SleepableLock<VirtioDisk> {
    pub fn write(self: Pin<&Self>, b: &mut Buf, ctx: &KernelCtx<'_, '_>) {
        //...
    }
}

위 method는 Buf가 주어진 self로부터 왔음을 확인하지 않으므로, Disk로부터 Buf를 받은 후, 다른 Disk로부터 받은 Buf로 그 Disk의 해당 부분을 덮어쓰게되면 invariant가 깨질 수 있게 됩니다.