OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [libnetworking/] [sys/] [buf.h] - Blame information for rev 30

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
2
 * Copyright (c) 1982, 1986, 1989, 1993
3
 *      The Regents of the University of California.  All rights reserved.
4
 * (c) UNIX System Laboratories, Inc.
5
 * All or some portions of this file are derived from material licensed
6
 * to the University of California by American Telephone and Telegraph
7
 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8
 * the permission of UNIX System Laboratories, Inc.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 * 3. All advertising materials mentioning features or use of this software
19
 *    must display the following acknowledgement:
20
 *      This product includes software developed by the University of
21
 *      California, Berkeley and its contributors.
22
 * 4. Neither the name of the University nor the names of its contributors
23
 *    may be used to endorse or promote products derived from this software
24
 *    without specific prior written permission.
25
 *
26
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36
 * SUCH DAMAGE.
37
 *
38
 *      @(#)buf.h       8.9 (Berkeley) 3/30/95
39
 * $Id: buf.h,v 1.2 2001-09-27 12:02:00 chris Exp $
40
 */
41
 
42
#ifndef _SYS_BUF_H_
43
#define _SYS_BUF_H_
44
 
45
#include <sys/queue.h>
46
 
47
#define NOLIST ((struct buf *)0x87654321)
48
 
49
struct buf;
50
 
51
struct iodone_chain {
52
        long    ic_prev_flags;
53
        void    (*ic_prev_iodone) __P((struct buf *));
54
        void    *ic_prev_iodone_chain;
55
        struct {
56
                long    ia_long;
57
                void    *ia_ptr;
58
        }       ic_args[5];
59
};
60
 
61
typedef TAILQ_HEAD(buf_queue_head, buf) buf_queue_head, *buf_queue_head_t;
62
 
63
/*
64
 * The buffer header describes an I/O operation in the kernel.
65
 */
66
struct buf {
67
        LIST_ENTRY(buf) b_hash;         /* Hash chain. */
68
        LIST_ENTRY(buf) b_vnbufs;       /* Buffer's associated vnode. */
69
        TAILQ_ENTRY(buf) b_freelist;    /* Free list position if not active. */
70
        TAILQ_ENTRY(buf) b_act;         /* Device driver queue when active. *new* */
71
        struct  proc *b_proc;           /* Associated proc; NULL if kernel. */
72
        long    b_flags;                /* B_* flags. */
73
        unsigned short b_qindex;        /* buffer queue index */
74
        unsigned char b_usecount;       /* buffer use count */
75
        int     b_error;                /* Errno value. */
76
        long    b_bufsize;              /* Allocated buffer size. */
77
        long    b_bcount;               /* Valid bytes in buffer. */
78
        long    b_resid;                /* Remaining I/O. */
79
        dev_t   b_dev;                  /* Device associated with buffer. */
80
        struct {
81
                caddr_t b_addr;         /* Memory, superblocks, indirect etc. */
82
        } b_un;
83
        caddr_t b_kvabase;              /* base kva for buffer */
84
        int     b_kvasize;              /* size of kva for buffer */
85
        void    *b_saveaddr;            /* Original b_addr for physio. */
86
        daddr_t b_lblkno;               /* Logical block number. */
87
        daddr_t b_blkno;                /* Underlying physical block number. */
88
                                        /* Function to call upon completion. */
89
        void    (*b_iodone) __P((struct buf *));
90
                                        /* For nested b_iodone's. */
91
        struct  iodone_chain *b_iodone_chain;
92
        struct  vnode *b_vp;            /* Device vnode. */
93
        int     b_dirtyoff;             /* Offset in buffer of dirty region. */
94
        int     b_dirtyend;             /* Offset of end of dirty region. */
95
        struct  ucred *b_rcred;         /* Read credentials reference. */
96
        struct  ucred *b_wcred;         /* Write credentials reference. */
97
        int     b_validoff;             /* Offset in buffer of valid region. */
98
        int     b_validend;             /* Offset of end of valid region. */
99
        daddr_t b_pblkno;               /* physical block number */
100
        caddr_t b_savekva;              /* saved kva for transfer while bouncing */
101
        void    *b_driver1;             /* for private use by the driver */
102
        void    *b_driver2;             /* for private use by the driver */
103
        void    *b_spc;
104
        union   cluster_info {
105
                TAILQ_HEAD(cluster_list_head, buf) cluster_head;
106
                TAILQ_ENTRY(buf) cluster_entry;
107
        } b_cluster;
108
        struct  vm_page *b_pages[btoc(MAXPHYS)];
109
        int             b_npages;
110
};
111
 
112
/* Device driver compatibility definitions. */
113
#define b_data   b_un.b_addr            /* b_un.b_addr is not changeable. */
114
 
115
/*
116
 * These flags are kept in b_flags.
117
 */
118
#define B_AGE           0x00000001      /* Move to age queue when I/O done. */
119
#define B_NEEDCOMMIT    0x00000002      /* Append-write in progress. */
120
#define B_ASYNC         0x00000004      /* Start I/O, do not wait. */
121
#define B_BAD           0x00000008      /* Bad block revectoring in progress. */
122
#define B_BUSY          0x00000010      /* I/O in progress. */
123
#define B_CACHE         0x00000020      /* Bread found us in the cache. */
124
#define B_CALL          0x00000040      /* Call b_iodone from biodone. */
125
#define B_DELWRI        0x00000080      /* Delay I/O until buffer reused. */
126
#define B_DIRTY         0x00000100      /* Dirty page to be pushed out async. */
127
#define B_DONE          0x00000200      /* I/O completed. */
128
#define B_EINTR         0x00000400      /* I/O was interrupted */
129
#define B_ERROR         0x00000800      /* I/O error occurred. */
130
#define B_GATHERED      0x00001000      /* LFS: already in a segment. */
131
#define B_INVAL         0x00002000      /* Does not contain valid info. */
132
#define B_LOCKED        0x00004000      /* Locked in core (not reusable). */
133
#define B_NOCACHE       0x00008000      /* Do not cache block after use. */
134
#define B_MALLOC        0x00010000      /* malloced b_data */
135
#define B_CLUSTEROK     0x00020000      /* Pagein op, so swap() can count it. */
136
#define B_PHYS          0x00040000      /* I/O to user memory. */
137
#define B_RAW           0x00080000      /* Set by physio for raw transfers. */
138
#define B_READ          0x00100000      /* Read buffer. */
139
#define B_TAPE          0x00200000      /* Magnetic tape I/O. */
140
#define B_RELBUF        0x00400000      /* Release VMIO buffer. */
141
#define B_WANTED        0x00800000      /* Process wants this buffer. */
142
#define B_WRITE         0x00000000      /* Write buffer (pseudo flag). */
143
#define B_WRITEINPROG   0x01000000      /* Write in progress. */
144
#define B_XXX           0x02000000      /* Debugging flag. */
145
#define B_PAGING        0x04000000      /* volatile paging I/O -- bypass VMIO */
146
#define B_ORDERED       0x08000000      /* Must guarantee I/O ordering */
147
#define B_VMIO          0x20000000      /* VMIO flag */
148
#define B_CLUSTER       0x40000000      /* pagein op, so swap() can count it */
149
#define B_BOUNCE        0x80000000      /* bounce buffer flag */
150
 
151
/*
152
 * number of buffer hash entries
153
 */
154
#define BUFHSZ 512
155
 
156
/*
157
 * buffer hash table calculation, originally by David Greenman
158
 */
159
#define BUFHASH(vnp, bn)        \
160
        (&bufhashtbl[(((unsigned long)(vnp) >> 7)+(int)(bn)) % BUFHSZ])
161
 
162
/*
163
 * Definitions for the buffer free lists.
164
 */
165
#define BUFFER_QUEUES   6       /* number of free buffer queues */
166
 
167
extern LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash;
168
extern TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES];
169
 
170
#define QUEUE_NONE      0        /* on no queue */
171
#define QUEUE_LOCKED    1       /* locked buffers */
172
#define QUEUE_LRU       2       /* useful buffers */
173
#define QUEUE_VMIO      3       /* VMIO buffers */
174
#define QUEUE_AGE       4       /* not-useful buffers */
175
#define QUEUE_EMPTY     5       /* empty buffer headers*/
176
 
177
/*
178
 * Zero out the buffer's data area.
179
 */
180
#define clrbuf(bp) {                                                    \
181
        bzero((bp)->b_data, (u_int)(bp)->b_bcount);                     \
182
        (bp)->b_resid = 0;                                               \
183
}
184
 
185
/* Flags to low-level allocation routines. */
186
#define B_CLRBUF        0x01    /* Request allocated buffer be cleared. */
187
#define B_SYNC          0x02    /* Do all allocations synchronously. */
188
 
189
#ifdef KERNEL
190
extern int      nbuf;                   /* The number of buffer headers */
191
extern struct   buf *buf;               /* The buffer headers. */
192
extern char     *buffers;               /* The buffer contents. */
193
extern int      bufpages;               /* Number of memory pages in the buffer pool. */
194
extern struct   buf *swbuf;             /* Swap I/O buffer headers. */
195
extern int      nswbuf;                 /* Number of swap I/O buffer headers. */
196
extern TAILQ_HEAD(swqueue, buf) bswlist;
197
 
198
void    bufinit __P((void));
199
void    bremfree __P((struct buf *));
200
int     bread __P((struct vnode *, daddr_t, int,
201
            struct ucred *, struct buf **));
202
int     breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int,
203
            struct ucred *, struct buf **));
204
int     bwrite __P((struct buf *));
205
void    bdwrite __P((struct buf *));
206
void    bawrite __P((struct buf *));
207
int     bowrite __P((struct buf *));
208
void    brelse __P((struct buf *));
209
void    bqrelse __P((struct buf *));
210
int     vfs_bio_awrite __P((struct buf *));
211
struct buf *     getpbuf __P((void));
212
struct buf *incore __P((struct vnode *, daddr_t));
213
struct buf *gbincore __P((struct vnode *, daddr_t));
214
int     inmem __P((struct vnode *, daddr_t));
215
struct buf *getblk __P((struct vnode *, daddr_t, int, int, int));
216
struct buf *geteblk __P((int));
217
int     allocbuf __P((struct buf *, int));
218
int     biowait __P((struct buf *));
219
void    biodone __P((struct buf *));
220
 
221
void    cluster_callback __P((struct buf *));
222
int     cluster_read __P((struct vnode *, u_quad_t, daddr_t, long,
223
            struct ucred *, struct buf **));
224
int     cluster_wbuild __P((struct vnode *, long, daddr_t, int));
225
void    cluster_write __P((struct buf *, u_quad_t));
226
int     physio __P((void (*)(struct buf *), struct buf *, dev_t,
227
            int, u_int (*)(struct buf *), struct uio *));
228
u_int   minphys __P((struct buf *));
229
void    vfs_bio_clrbuf __P((struct buf *));
230
void    vfs_busy_pages __P((struct buf *, int clear_modify));
231
void    vfs_unbusy_pages(struct buf *);
232
void    vwakeup __P((struct buf *));
233
void    vmapbuf __P((struct buf *));
234
void    vunmapbuf __P((struct buf *));
235
void    relpbuf __P((struct buf *));
236
void    brelvp __P((struct buf *));
237
void    bgetvp __P((struct vnode *, struct buf *));
238
void    pbgetvp __P((struct vnode *, struct buf *));
239
void    pbrelvp __P((struct buf *));
240
void    reassignbuf __P((struct buf *, struct vnode *));
241
struct  buf *trypbuf __P((void));
242
void    vm_bounce_alloc __P((struct buf *));
243
void    vm_bounce_free __P((struct buf *));
244
vm_offset_t     vm_bounce_kva_alloc __P((int));
245
void    vm_bounce_kva_alloc_free __P((vm_offset_t, int));
246
#endif /* KERNEL */
247
 
248
#endif /* !_SYS_BUF_H_ */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.