当前位置:首页 > 行业发展 > 正文

liburing-io_uring(7) 中文版说明

io_uring(7)io_uring-异步I/O设施简介////io__SZ1024/*Macrosforbarriersneededbyio_uring*/defineio_uring_smp_load_acquire(p)\atomic_load_explicit((_Atomictypeof...

io_uring(7)io_uring-异步I/O设施简介////io__SZ1024/*Macrosforbarriersneededbyio_uring*/defineio_uring_smp_l......

io_uring(7)

io_uring-异步I/O设施

简介

////io__SZ1024/*Macrosforbarriersneededbyio_uring*/defineio_uring_smp_load_acquire(p)\atomic_load_explicit((_Atomictypeof(*(p))*)(p),\memory_order_acquire)intring_fd;unsigned*sring_tail,*sring_mask,*sring_array,*cring_head,*cring_tail,*cring_mask;structio_uring_sqe*sqes;structio_uring_cqe*cqes;charbuff[BLOCK_SZ];off_toffset;/**Systemcallwrappersprovidedsinceglibcdoesnotyet*providewrappersforio_uringsystemcalls.**/intio_uring_setup(unsignedentries,structio_uring_params*p){return(int)syscall(__NR_io_uring_setup,entries,p);}intio_uring_enter(intring_fd,unsignedintto_submit,unsignedintmin_complete,unsignedintflags){return(int)syscall(__NR_io_uring_enter,ring_fd,to_submit,min_complete,flags,NULL,0);}intapp_setup_uring(void){structio_uring_paramsp;void*sq_ptr,*cq_ptr;/*Seeio_uring_setup(2)forio_uring_*/memset(p,0,sizeof(p));ring_fd=io_uring_setup(QUEUE_DEPTH,p);if(ring_fd0){perror("io_uring_setup");return1;}/**io_uringcommunicationhappensvia2sharedkernel-userspacering*buffers,whichcanbejointlymappedwithasinglemmap()callin*kernels=5.4.*/intsring_sz=_+_entries*sizeof(unsigned);intcring_sz=_+_entries*sizeof(structio_uring_cqe);/*Ratherthancheckforkernelversion,therecommedwayisto*checkthefeaturesfieldoftheio_uring_paramsstructure,whichisa*_FEAT_SINGLE_MMAPisset,wecandoawaywiththe*secondmmap()calltomapinthecompletionringseparately.*/if(_FEAT_SINGLE_MMAP){if(cring_szsring_sz)sring_sz=cring_sz;cring_sz=sring_sz;}/*Mapinthesubmissionandcompletionqueueringbuffers.*,though.*/sq_ptr=mmap(0,sring_sz,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_POPULATE,ring_fd,IORING_OFF_SQ_RING);if(sq_ptr==MAP_FAILED){perror("mmap");return1;}if(_FEAT_SINGLE_MMAP){cq_ptr=sq_ptr;}else{/*Mapinthecompletionqueueringbufferinolderkernelsseparately*/cq_ptr=mmap(0,cring_sz,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_POPULATE,ring_fd,IORING_OFF_CQ_RING);if(cq_ptr==MAP_FAILED){perror("mmap");return1;}}/*Saveusefulfieldsforlatereasyreference*/sring_tail=sq_ptr+_;sring_mask=sq_ptr+__mask;sring_array=sq_ptr+_;/*Mapinthesubmissionqueueentriesarray*/sqes=mmap(0,_entries*sizeof(structio_uring_sqe),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_POPULATE,ring_fd,IORING_OFF_SQES);if(sqes==MAP_FAILED){perror("mmap");return1;}/*Saveusefulfieldsforlatereasyreference*/cring_head=cq_ptr+_;cring_tail=cq_ptr+_;cring_mask=cq_ptr+__mask;cqes=cq_ptr+_;return0;}/**Readfromcompletionqueue.*Inthisfunction,wereadcompletioneventsfromthecompletionqueue.*WedequeuetheCQE,updateandheadandreturntheresultoftheoperation.**/intread_from_cq(){structio_uring_cqe*cqe;unsignedhead;/*Readbarrier*/head=io_uring_smp_load_acquire(cring_head);/**Remember,==tail,itmeansthatthe*bufferisempty.**/if(head==*cring_tail)return-1;/*Gettheentry*/cqe=cqes[head(*cring_mask)];if(cqe-res0)fprintf(stderr,"Error:%s\n",strerror(abs(cqe-res)));head++;/*Writebarriersothatupdatetotheheadaremadevisible*/io_uring_smp_store_release(cring_head,head);returncqe-res;}/**Submitareadorawriterequesttothesubmissionqueue.**/intsubmit_to_sq(intfd,intop){unsignedindex,tail;/*AddoursubmissionqueueentrytothetailoftheSQEringbuffer*/tail=*sring_tail;index=tail*sring_mask;structio_uring_sqe*sqe=sqes[index];/*Fillintheparametersrequiredforthereadorwriteoperation*/sqe-opcode=op;sqe-fd=fd;sqe-addr=(unsignedlong)buff;if(op==IORING_OP_READ){memset(buff,0,sizeof(buff));sqe-len=BLOCK_SZ;}else{sqe-len=strlen(buff);}sqe-off=offset;sring_array[index]=index;tail++;/*Updatethetail*/io_uring_smp_store_release(sring_tail,tail);/**Tellthekernelwehavesubmittedeventswiththeio_uring_enter()*_ENTER_GETEVENTSflagwhich*causestheio_uring_enter()calltowaituntilmin_complete*(the3rdparam)eventscomplete.**/intret=io_uring_enter(ring_fd,1,1,IORING_ENTER_GETEVENTS);if(ret0){perror("io_uring_enter");return-1;}returnret;}intmain(intargc,char*argv[]){intres;/*Setupio_uringforuse*/if(app_setup_uring()){fprintf(stderr,"Unabletosetupuring!\n");return1;}/**Awhileloopthatreadsfromstdinandwritestostdout.*BreaksonEOF.*/while(1){/*Initiatereadfromstdinandwaitforittocomplete*/submit_to_sq(STDIN_FILENO,IORING_OP_READ);/*Readcompletionqueueentry*/res=read_from_cq();if(res0){/**/submit_to_sq(STDOUT_FILENO,IORING_OP_WRITE);read_from_cq();}elseif(res==0){/*reachedEOF*/break;}elseif(res0){/*Errorreadingfile*/fprintf(stderr,"Error:%s\n",strerror(abs(res)));break;}offset+=res;}return0;}

参见

io_uring_enter(2)io_uring_register(2)io_uring_setup(2)

最新文章