2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
11 #include "afs/param.h"
18 #include "afs/sysincludes.h" /* Standard vendor system headers */
19 #include "afsincludes.h" /* Afs-based standard headers */
20 #include "afs/afs_stats.h" /* afs statistics */
25 #include "sys/lockl.h"
26 #include "sys/sleep.h"
27 #include "sys/syspest.h"
28 #include "sys/lock_def.h"
29 /*lock_t osi_fsplock = LOCK_AVAIL;*/
32 afs_lock_t osi_fsplock;
36 static struct osi_packet {
37 struct osi_packet *next;
38 } *freePacketList = NULL, *freeSmallList;
39 afs_lock_t osi_flplock;
42 /* free space allocated by AllocLargeSpace. Also called by mclput when freeing
43 * a packet allocated by osi_NetReceive. */
46 osi_FreeLargeSpace(void *adata)
51 AFS_STATCNT(osi_FreeLargeSpace);
52 afs_stats_cmperf.LargeBlocksActive--;
53 MObtainWriteLock(&osi_flplock, 322);
54 ((struct osi_packet *)adata)->next = freePacketList;
55 freePacketList = adata;
56 MReleaseWriteLock(&osi_flplock);
60 osi_FreeSmallSpace(void *adata)
65 AFS_STATCNT(osi_FreeSmallSpace);
66 afs_stats_cmperf.SmallBlocksActive--;
67 MObtainWriteLock(&osi_fsplock, 323);
68 ((struct osi_packet *)adata)->next = freeSmallList;
69 freeSmallList = adata;
70 MReleaseWriteLock(&osi_fsplock);
74 /* allocate space for sender */
76 osi_AllocLargeSpace(size_t size)
78 register struct osi_packet *tp;
82 AFS_STATCNT(osi_AllocLargeSpace);
83 if (size > AFS_LRALLOCSIZ)
84 osi_Panic("osi_AllocLargeSpace: size=%d\n", size);
85 afs_stats_cmperf.LargeBlocksActive++;
86 if (!freePacketList) {
89 afs_stats_cmperf.LargeBlocksAlloced++;
90 p = (char *)afs_osi_Alloc(AFS_LRALLOCSIZ);
91 #ifdef KERNEL_HAVE_PIN
93 * Need to pin this memory since under heavy conditions this memory
94 * could be swapped out; the problem is that we could inside rx where
95 * interrupts are disabled and thus we would panic if we don't pin it.
97 pin(p, AFS_LRALLOCSIZ);
101 MObtainWriteLock(&osi_flplock, 324);
104 freePacketList = tp->next;
105 MReleaseWriteLock(&osi_flplock);
110 /* allocate space for sender */
112 osi_AllocSmallSpace(size_t size)
114 register struct osi_packet *tp;
116 AFS_STATCNT(osi_AllocSmallSpace);
117 if (size > AFS_SMALLOCSIZ)
118 osi_Panic("osi_AllocSmallS: size=%d\n", size);
120 if (!freeSmallList) {
121 afs_stats_cmperf.SmallBlocksAlloced++;
122 afs_stats_cmperf.SmallBlocksActive++;
123 return afs_osi_Alloc(AFS_SMALLOCSIZ);
125 afs_stats_cmperf.SmallBlocksActive++;
126 MObtainWriteLock(&osi_fsplock, 327);
129 freeSmallList = tp->next;
130 MReleaseWriteLock(&osi_fsplock);
137 shutdown_osinet(void)
139 extern int afs_cold_shutdown;
141 AFS_STATCNT(shutdown_osinet);
142 if (afs_cold_shutdown) {
143 struct osi_packet *tp;
145 while ((tp = freePacketList)) {
146 freePacketList = tp->next;
147 afs_osi_Free(tp, AFS_LRALLOCSIZ);
148 #ifdef KERNEL_HAVE_PIN
149 unpin(tp, AFS_LRALLOCSIZ);
153 while ((tp = freeSmallList)) {
154 freeSmallList = tp->next;
155 afs_osi_Free(tp, AFS_SMALLOCSIZ);
156 #ifdef KERNEL_HAVE_PIN
157 unpin(tp, AFS_SMALLOCSIZ);
160 LOCK_INIT(&osi_fsplock, "osi_fsplock");
161 LOCK_INIT(&osi_flplock, "osi_flplock");