Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/sys/dev/ipmi/ipmi.c 257421 2013-10-31 05:13:53Z glebius $");
---
> __FBSDID("$FreeBSD: head/sys/dev/ipmi/ipmi.c 278321 2015-02-06 16:45:10Z jhb $");
51a52,68
> /*
> * Driver request structures are allocated on the stack via alloca() to
> * avoid calling malloc(), especially for the watchdog handler.
> * To avoid too much stack growth, a previously allocated structure can
> * be reused via IPMI_INIT_DRIVER_REQUEST(), but the caller should ensure
> * that there is adequate reply/request space in the original allocation.
> */
> #define IPMI_INIT_DRIVER_REQUEST(req, addr, cmd, reqlen, replylen) \
> bzero((req), sizeof(struct ipmi_request)); \
> ipmi_init_request((req), NULL, 0, (addr), (cmd), (reqlen), (replylen))
>
> #define IPMI_ALLOC_DRIVER_REQUEST(req, addr, cmd, reqlen, replylen) \
> (req) = __builtin_alloca(sizeof(struct ipmi_request) + \
> (reqlen) + (replylen)); \
> IPMI_INIT_DRIVER_REQUEST((req), (addr), (cmd), (reqlen), \
> (replylen))
>
184,185c201,202
< msleep(&dev->ipmi_requests, &sc->ipmi_lock, PWAIT,
< "ipmidrain", 0);
---
> msleep(&dev->ipmi_requests, &sc->ipmi_requests_lock,
> PWAIT, "ipmidrain", 0);
218c235
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_ALLOC_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
234d250
< ipmi_free_request(req);
246c262
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_ALLOC_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
260,262c276
< ipmi_free_request(req);
<
< req = ipmi_alloc_driver_request(
---
> IPMI_ALLOC_DRIVER_REQUEST(req,
271d284
< ipmi_free_request(req);
481,484c494,496
< /* Allocate a new request with request and reply buffers. */
< struct ipmi_request *
< ipmi_alloc_request(struct ipmi_device *dev, long msgid, uint8_t addr,
< uint8_t command, size_t requestlen, size_t replylen)
---
> static __inline void
> ipmi_init_request(struct ipmi_request *req, struct ipmi_device *dev, long msgid,
> uint8_t addr, uint8_t command, size_t requestlen, size_t replylen)
486d497
< struct ipmi_request *req;
488,489d498
< req = malloc(sizeof(struct ipmi_request) + requestlen + replylen,
< M_IPMI, M_WAITOK | M_ZERO);
501a511,522
> }
>
> /* Allocate a new request with request and reply buffers. */
> struct ipmi_request *
> ipmi_alloc_request(struct ipmi_device *dev, long msgid, uint8_t addr,
> uint8_t command, size_t requestlen, size_t replylen)
> {
> struct ipmi_request *req;
>
> req = malloc(sizeof(struct ipmi_request) + requestlen + replylen,
> M_IPMI, M_WAITOK | M_ZERO);
> ipmi_init_request(req, dev, msgid, addr, command, requestlen, replylen);
536c557
< /* Enqueue an internal driver request and wait until it is completed. */
---
> /* Perform an internal driver request. */
541d561
< int error;
543,550c563
< IPMI_LOCK(sc);
< error = sc->ipmi_enqueue_request(sc, req);
< if (error == 0)
< error = msleep(req, &sc->ipmi_lock, 0, "ipmireq", timo);
< if (error == 0)
< error = req->ir_error;
< IPMI_UNLOCK(sc);
< return (error);
---
> return (sc->ipmi_driver_request(sc, req, timo));
567c580
< cv_wait(&sc->ipmi_request_added, &sc->ipmi_lock);
---
> cv_wait(&sc->ipmi_request_added, &sc->ipmi_requests_lock);
601c614
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_ALLOC_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
625,627c638
< ipmi_free_request(req);
<
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
636d646
< ipmi_free_request(req);
683c693,694
< mtx_init(&sc->ipmi_lock, device_get_nameunit(dev), "ipmi", MTX_DEF);
---
> mtx_init(&sc->ipmi_requests_lock, "ipmi requests", NULL, MTX_DEF);
> mtx_init(&sc->ipmi_io_lock, "ipmi io", NULL, MTX_DEF);
696c707
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_ALLOC_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
702d712
< ipmi_free_request(req);
706d715
< ipmi_free_request(req);
712d720
< ipmi_free_request(req);
717d724
< ipmi_free_request(req);
727,729c734
< ipmi_free_request(req);
<
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
741d745
< ipmi_free_request(req);
744c748
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
750,751c754
< if (req->ir_compcode != 0) {
< ipmi_free_request(req);
---
> if (req->ir_compcode != 0)
753,754d755
< }
< ipmi_free_request(req);
759c760
< req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0),
---
> IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
770d770
< ipmi_free_request(req);
837c837,838
< msleep(sc->ipmi_kthread, &sc->ipmi_lock, 0, "ipmi_wait", 0);
---
> msleep(sc->ipmi_kthread, &sc->ipmi_requests_lock, 0,
> "ipmi_wait", 0);
844c845,846
< mtx_destroy(&sc->ipmi_lock);
---
> mtx_destroy(&sc->ipmi_io_lock);
> mtx_destroy(&sc->ipmi_requests_lock);