Print this page
5042 stop using deprecated atomic functions


 230                 realsize = ksyms_snapshot(ksyms_bcopy, hptr, size);
 231                 if (realsize <= size)
 232                         break;
 233                 size = realsize;
 234                 size = ksyms_buflist_alloc(&hdr, size);
 235                 if (size == 0)
 236                         return (ENOMEM);
 237                 hptr = (void *)&hdr;
 238         }
 239 
 240         addr = ksyms_mapin(&hdr, realsize);
 241         ksyms_buflist_free(&hdr);
 242         if (addr == NULL)
 243                 return (EOVERFLOW);
 244 
 245         /*
 246          * Reserve a clone entry.  Note that we don't use clone 0
 247          * since that's the "real" minor number.
 248          */
 249         for (clone = 1; clone < nksyms_clones; clone++) {
 250                 if (casptr(&ksyms_clones[clone].ksyms_base, 0, addr) == 0) {

 251                         ksyms_clones[clone].ksyms_size = realsize;
 252                         *devp = makedevice(getemajor(*devp), clone);
 253                         (void) ddi_prop_update_int(*devp, ksyms_devi,
 254                             "size", realsize);
 255                         modunload_disable();
 256                         return (0);
 257                 }
 258         }
 259         cmn_err(CE_NOTE, "ksyms: too many open references");
 260         (void) as_unmap(curproc->p_as, addr, roundup(realsize, PAGESIZE));
 261         return (ENXIO);
 262 }
 263 
 264 /* ARGSUSED */
 265 static int
 266 ksyms_close(dev_t dev, int flag, int otyp, struct cred *cred)
 267 {
 268         minor_t clone = getminor(dev);
 269 
 270         (void) as_unmap(curproc->p_as, ksyms_clones[clone].ksyms_base,




 230                 realsize = ksyms_snapshot(ksyms_bcopy, hptr, size);
 231                 if (realsize <= size)
 232                         break;
 233                 size = realsize;
 234                 size = ksyms_buflist_alloc(&hdr, size);
 235                 if (size == 0)
 236                         return (ENOMEM);
 237                 hptr = (void *)&hdr;
 238         }
 239 
 240         addr = ksyms_mapin(&hdr, realsize);
 241         ksyms_buflist_free(&hdr);
 242         if (addr == NULL)
 243                 return (EOVERFLOW);
 244 
 245         /*
 246          * Reserve a clone entry.  Note that we don't use clone 0
 247          * since that's the "real" minor number.
 248          */
 249         for (clone = 1; clone < nksyms_clones; clone++) {
 250                 if (atomic_cas_ptr(&ksyms_clones[clone].ksyms_base, 0, addr) ==
 251                     0) {
 252                         ksyms_clones[clone].ksyms_size = realsize;
 253                         *devp = makedevice(getemajor(*devp), clone);
 254                         (void) ddi_prop_update_int(*devp, ksyms_devi,
 255                             "size", realsize);
 256                         modunload_disable();
 257                         return (0);
 258                 }
 259         }
 260         cmn_err(CE_NOTE, "ksyms: too many open references");
 261         (void) as_unmap(curproc->p_as, addr, roundup(realsize, PAGESIZE));
 262         return (ENXIO);
 263 }
 264 
 265 /* ARGSUSED */
 266 static int
 267 ksyms_close(dev_t dev, int flag, int otyp, struct cred *cred)
 268 {
 269         minor_t clone = getminor(dev);
 270 
 271         (void) as_unmap(curproc->p_as, ksyms_clones[clone].ksyms_base,