📄 libhpf.c
字号:
#include "defs.h"
#include "libhpf.h"
hpf_t * hpf_open(char *dev,char *ebuf)
{
int fd;
char *buff;
kernel_addr_space_t *knl_mapped_addr;
hpf_t *ret = (hpf_t *)malloc(sizeof(*ret));
if(ret == NULL)
{
sprintf(ebuf,"No memory");
goto fail;
}
fd = open(dev,O_RDWR);
if(fd<0)
{
free(ret);
sprintf(ebuf,"open dev file error : %s",strerror(errno));
goto fail;
}
ret->fd = fd;
buff = (char *)malloc((BUFF_SIZE+4096)*sizeof(char));
if(buff == NULL)
{
sprintf(ebuf,"Fail to allocate user buff");
goto fail;
}
ret->page_align_addr = PAGE_ALIGN(buff);
ret->buff_addr = buff;
memset(buff,0,BUFF_SIZE+4096);/*force os allocate enough physical pages*/
if(ioctl(fd,KA_IOCINITBUF,ret->page_align_addr) < 0)
{
sprintf(ebuf,"ioctl device fail");
goto fail;
}
ret->knl_mapped_addr = (kernel_addr_space_t*)mmap(NULL,sizeof(kernel_addr_space_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
ret->rx_q = &(knl_mapped_addr->rx_q);
ret->free_q = &(knl_mapped_addr->free_q);
return ret;
fail:
free(ret);
close(fd);
free(buff);
return NULL;
}
void hpf_close(hpf_t *p)
{
if(p)
{
munmap(p->knl_mapped_addr,sizeof(kernel_addr_space_t));
free(p->buff_addr);
close(p->fd);
free(p);
}
}
char *hpf_getpack(hpf_t *p)
{
int rx_id;
if(!p)
return NULL;
while((rx_id = dequeue(p->rx_q)) < 0)
usleep(30);
return (p->page_align_addr+(rx_id<<BLK_SIZE_SHIFT)) /*node index to virtual address translation*/
}
void hpf_releasepack(hpf_t *p,char *addr)
{
uint free_id;
if(!p || !addr)
return;
free_id = (addr-p->page_align_addr)>>BLK_SIZE_SHIFT;
enqueue(p->free_q,free_id);/*queue never full*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -