使nproc可以正确获取到cpu核心数 (#689)

This commit is contained in:
yuyi2439
2024-04-04 12:41:19 +08:00
committed by GitHub
parent 9b96c5b547
commit 9430523b46
6 changed files with 36 additions and 10 deletions

View File

@ -257,10 +257,10 @@ impl ProcFSInode {
offset: usize,
len: usize,
buf: &mut [u8],
_pdata: &mut ProcfsFilePrivateData,
pdata: &mut ProcfsFilePrivateData,
) -> Result<usize, SystemError> {
let start = _pdata.data.len().min(offset);
let end = _pdata.data.len().min(offset + len);
let start = pdata.data.len().min(offset);
let end = pdata.data.len().min(offset + len);
// buffer空间不足
if buf.len() < (end - start) {
@ -268,7 +268,7 @@ impl ProcFSInode {
}
// 拷贝数据
let src = &_pdata.data[start..end];
let src = &pdata.data[start..end];
buf[0..src.len()].copy_from_slice(src);
return Ok(src.len());
}

View File

@ -80,6 +80,10 @@ impl CpuMask {
begin: true,
}
}
pub fn inner(&self) -> &AllocBitmap {
&self.bmp
}
}
pub struct CpuMaskIter<'a> {

View File

@ -13,6 +13,7 @@ use self::{
pub mod core;
pub mod cpu;
pub mod init;
mod syscall;
pub fn kick_cpu(cpu_id: ProcessorId) -> Result<(), SystemError> {
// todo: 增加对cpu_id的有效性检查

15
kernel/src/smp/syscall.rs Normal file
View File

@ -0,0 +1,15 @@
use bitmap::traits::BitMapOps;
use system_error::SystemError;
use crate::syscall::Syscall;
use super::cpu::smp_cpu_manager;
impl Syscall {
pub fn getaffinity(_pid: i32, set: &mut [u8]) -> Result<usize, SystemError> {
let cpu_manager = smp_cpu_manager();
let src = unsafe { cpu_manager.possible_cpus().inner().as_bytes() };
set[0..src.len()].copy_from_slice(src);
Ok(0)
}
}

View File

@ -963,9 +963,15 @@ impl Syscall {
}
SYS_SCHED_GETAFFINITY => {
// todo: 这个系统调用还没有实现
let pid = args[0] as i32;
let size = args[1];
let set_vaddr = args[2];
Err(SystemError::ENOSYS)
let mut user_buffer_writer =
UserBufferWriter::new(set_vaddr as *mut u8, size, frame.is_from_user())?;
let set: &mut [u8] = user_buffer_writer.buffer(0)?;
Self::getaffinity(pid, set)
}
#[cfg(target_arch = "x86_64")]